#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include <time.h>

#include "fonction.h"
#include "constantes.h"

int Nombredelignes (FILE* fichier)
{
	int nombre=0;
	int c;

	if (fichier==NULL)
	{
		printf("ERREUR NOM DU FICHIER NULL");
		return EXIT_FAILURE;
	}
	while((c = fgetc(fichier)) != EOF){
		if(c == '\n')
			++nombre;
	}
	rewind(fichier);
	return (nombre);
}

void photo(Etudiant* promo,int Nb)// création du chemin de la photo
{
	int i=0;

	for(i=0;i<Nb;i++) {
		sprintf(promo[i].chemin_photo,"rep_photo_etudiants/%s.jpg",promo[i].login);
	}
}


int comptage_stpi(Etudiant* promo, int Nb)
{
	int i=0;
	int compteur=0;
	char stpi[4]="STP";


	for (i=0;i<Nb;i++)
	{
		if (strcmp(promo[i].origine,stpi)==1)/* ==1 pour Linux / ==0 pour Windows*/
			compteur++;

	}

	return compteur;
}

int comptage_externe(int stpi, int Nb)
{
	return (Nb-stpi);
}

void liberation_alloc_tab(Etudiant* promo, Etudiant* tab_stpi, Etudiant* tab_externe,Etudiant *groupe_A,Etudiant *groupe_B,Binome *tab_binome_groupe_A,Binome *tab_binome_groupe_B)
{
	free(promo); //voir quand est ce que ce tableau ne sera plus necessaire et liberer la memoire

	free(tab_stpi);
	free(tab_externe);
	free(groupe_A);
	free(groupe_B);
	free(tab_binome_groupe_A);
	free(tab_binome_groupe_B);
}

void repartition_stpi_externe(Etudiant* promo, Etudiant* tab_stpi,Etudiant* externe,int Nb)
{
	int i=0,j=0,k=0;
	char stpi[4]="STP";

	for (i=0;i<Nb;i++)
	{
		if (strcmp(promo[i].origine,stpi)==1)/* ==1 pour Linux / ==0 pour Windows*/
		{
			tab_stpi[j]=promo[i];
			j++;
		}
		else
		{
			externe[k]=promo[i];
			k++;
		}
	}

}

void creation_groupe(Etudiant* promo, Etudiant* tab_stpi,Etudiant*  tab_externe,int stpi, int externe, Etudiant *groupe_A, Etudiant *groupe_B,int Nb_groupe_A, int Nb_groupe_B)
{

	int i, k=0;
	int* tab_aleatoire_stpi=malloc((stpi)*sizeof (int));
	int* tab_aleatoire_externe=malloc((externe)*sizeof (int));

	srand(time(NULL));

	aleatoire (stpi, tab_aleatoire_stpi);
	aleatoire (externe,tab_aleatoire_externe);

	for(i=0;i<Nb_groupe_A;i++){
		if (i<(stpi/2)){
			groupe_A[i] = tab_stpi[tab_aleatoire_stpi[i]];
		}
		else {
			groupe_A[i] = tab_externe[tab_aleatoire_externe[k]];
			k++;
		}
	}


	if (stpi%2==0){

		for(i=0;i<Nb_groupe_B;i++){
			if (i<(stpi/2)){
				groupe_B[i] = tab_stpi[tab_aleatoire_stpi[i+stpi/2]];
			}
			else {
				groupe_B[i] = tab_externe[tab_aleatoire_externe[k]];
				k++;
			}
		}

	}

	if (stpi%2!=0){

		for(i=0;i<Nb_groupe_B;i++){
			if (i<=(stpi/2)){
				groupe_B[i] = tab_stpi[tab_aleatoire_stpi[i+stpi/2]];
			}
			else {
				groupe_B[i] = tab_externe[tab_aleatoire_externe[k]];
				k++;
			}
		}


	}

	free(tab_aleatoire_stpi);
	free(tab_aleatoire_externe);
}

void aleatoire(int Nb_etudiant,int* tableau)
{
	int nombre_tire=0;
	int temp=0;
	int i=0;
	// On remplit le tableau de manière à ce qu'il soit trié
	for(i = 0; i< Nb_etudiant; i++){
		tableau[i]=i;
	}

	for(i = 0; i< Nb_etudiant;i++){
		nombre_tire=rand()%(Nb_etudiant);
		// On échange les contenus des cases i et nombre_tire
		temp = tableau[i];
		tableau[i] = tableau[nombre_tire];
		tableau[nombre_tire]=temp;
	}
}


int Nb_binome_groupe(int Nb_etudiants)
{
	if ((Nb_etudiants%2)==0)
		return (Nb_etudiants/2);
	else
		return (Nb_etudiants/2)+1;

}
void creation_binome(Binome *tab_binome,Etudiant *groupe,int Nb_groupe, int Nb_binomes)
{
	int i=0;
	int min=0;
	int Nb_externe_groupe, Nb_stpi_groupe;

	// on compte les stpi et externe du groupe
	// on fait l'alloc mémmoire
	// on sépare dans deux tableaux
	// on crée par la suite les binomes

	Etudiant * groupe_stpi=NULL;
	Etudiant * groupe_externe=NULL;

	Nb_stpi_groupe=comptage_stpi(groupe, Nb_groupe);
	Nb_externe_groupe=comptage_externe(Nb_stpi_groupe,Nb_groupe);

	groupe_stpi = (Etudiant*)malloc (sizeof(Etudiant)*Nb_stpi_groupe);
	groupe_externe = (Etudiant*)malloc (sizeof(Etudiant)*Nb_externe_groupe);

	if(Nb_stpi_groupe>Nb_externe_groupe)
		min=Nb_externe_groupe;
	else
		min=Nb_stpi_groupe;

	// séparation des stpi et des externes du groupe dans deux tableauxw différents

	repartition_stpi_externe(groupe, groupe_stpi,groupe_externe,Nb_groupe);

	// on crée maintenant les binomes
	for(i=0;i<min;i++)
	{
		tab_binome[i].b1=groupe_stpi[i];
		tab_binome[i].b2=groupe_externe[i];
		tab_binome[i].numero=i+1;
	}

	if(Nb_stpi_groupe>Nb_externe_groupe){

		for(i=min;i<Nb_groupe;i=i+2)
		{
			tab_binome[i].b1=groupe_stpi[i];
			tab_binome[i].b2=groupe_stpi[i+1];
			tab_binome[i].numero=i+1;
		}
	}

	if(Nb_stpi_groupe<Nb_externe_groupe)
	{
		{
			for(i=min;i<Nb_groupe;i=i+2){
				tab_binome[i].b1=groupe_externe[i];
				tab_binome[i].b2=groupe_externe[i+1];
				tab_binome[i].numero=i+1;
			}
		}
	}

	free(groupe_stpi);
	free(groupe_externe);

}
